/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hochschild.sgv.struts.action;

import com.hochschild.sgv.dao.EquipoDao;
import com.hochschild.sgv.domain.PersonalSap;
import com.hochschild.sgv.domain.Solicitud;
import com.hochschild.sgv.domain.Usuario;
import com.hochschild.sgv.service.EquipoManager;
import com.hochschild.sgv.service.PlanificacionManager;
import com.hochschild.sgv.service.implementacion.SimpleEquipoManager;
//import com.hochschild.sgv.service.VacacionesManager;
import com.hochschild.sgv.struts.form.PlanificacionActionForm;
import com.hochschild.sgv.util.ConexionBD;
import com.hochschild.sgv.util.ConexionBDSeg;
import com.hochschild.sgv.util.Constantes;
import com.hochschild.sgv.util.ControlPlanificacion;
import com.hochschild.sgv.util.DiasCalendario;
import com.hochschild.sgv.util.EnviarCorreo;
import com.hochschild.sgv.util.FechaUtil;
//import java.util.AbstractList;
import com.hochschild.sgv.util.SolicitudVacacion;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.springframework.beans.factory.annotation.Autowired;

/**
 *
 * @author Christian Alexander Morales Vargas (cmorales.corporacion@gmail.com)
 */

public class PlanificacionAction extends DispatchAction {

    @Autowired
    private EquipoManager equipoManager;
    @Autowired
    private PlanificacionManager planificacionManager;
    @Autowired
    private EquipoDao equipoDao;
    private static final String SUCCESS = "success";
    private static final String DESCANSO= "rojo";
    private static final String LABORALES= "azul";

    private String valoresParaValidacion="";

    
    public ActionForward cargarPlanificacion(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
            HttpSession session = request.getSession();
            Usuario usuario = (Usuario) session.getAttribute("session_usuario"); 
                ControlPlanificacion control= new ControlPlanificacion();
                control.cargarPlanificacion(request, usuario);
               return mapping.findForward(SUCCESS);
    }
    
    public ActionForward cargarMiPlanificacion(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
            HttpSession session = request.getSession();
            Usuario usuario = (Usuario) session.getAttribute("session_usuario"); 
                ControlPlanificacion control= new ControlPlanificacion();
                control.cargarMiPlanificacion(request, usuario);
            int anioActual= FechaUtil.getAnioActual();
            String estado= planificacionManager.consultarEstado(usuario.getIdUsuario(), anioActual, usuario.getIdPuestoJefeInmediato());
            request.setAttribute("estado",estado);
            System.out.println("estado: " + estado);
               return mapping.findForward("miplanificacion");
    }
    
        public ActionForward cargarLstCompaneros(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
         HttpSession session = request.getSession();
         Usuario usuario = (Usuario) session.getAttribute("session_usuario");
         ControlPlanificacion control= new ControlPlanificacion();
         control.cargarLstCompaneros(request, usuario);
         return mapping.findForward("cargarLstCompaneros");
     }
        
    public ActionForward grabarPlanificacion(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
         Date fechaNow = new Date();
         int anioActual = FechaUtil.getAnioActual();
         Date date_ini = FechaUtil.stringaToDateDDMMYYYY("01-01-" + String.valueOf(anioActual + 0));    
         Date date_fin = FechaUtil.stringaToDateDDMMYYYY("31-12-" + String.valueOf(anioActual + 1)); 
         
        HttpSession session = request.getSession();
        Usuario usuario = (Usuario) session.getAttribute("session_usuario"); 
        
        PlanificacionActionForm resp = (PlanificacionActionForm) form;
        String operacion= resp.getEstado();
        System.out.println("operacion: " + operacion);
        if(operacion.equals("g"))operacion=Constantes.ESTADO_JEFE_GUARDAR;
        if(operacion.equals("e"))operacion=Constantes.ESTADO_JEFE_ENVIAR;
        String[] txtDinamicos =  resp.getTextDinamicos();    
        String[] equipo = resp.getEquipo();
        String[] check= resp.getSeleccionados();
        List<Solicitud> lstRegistros = new ArrayList<Solicitud>();
        Solicitud regSolicitud;
        String valor="";
        int cont=0;
        int sw_date_fin=0;
        Date date_iniBk = null;
        Date date_finBk = null;
        int cantDiasAnioActual = FechaUtil.getDiasXAnio(date_ini) ;
        int cantDiasAnioProximo = FechaUtil.getDiasXAnio(date_fin) ;
        int cantDiasDosanios = cantDiasAnioActual + cantDiasAnioProximo;
        System.out.println("Grabar cantDiasDosanios: " + cantDiasDosanios);
        int i; int j=0; int k=0;
        List lstequipo= new ArrayList();
        String estado="";
        
        for (i = 0; i < equipo.length; i++) {
            System.out.println("check[" + i + "]: " + check[i]); 
            if(check[i].equals("on")){
                estado= planificacionManager.consultarEstado(equipo[i], anioActual, usuario.getIdPuesto());// verifica que los colaboradores tengan el estado correcto en caso se trabaje en paralelo
                if(!estado.equals(Constantes.ESTADO_EMPLEADO_GUARDAR)){
                    lstequipo.add(equipo[i]);
                    for ( j = 0; j < cantDiasDosanios; j++) {
                        valor = txtDinamicos[k];
                        if (valor.equals(Constantes.SOLICITUD_PLANIFICADA)){
                           sw_date_fin = 0;
                           cont++;
                           if (cont==1){
                               if(j > cantDiasAnioActual) 
                                   date_iniBk = FechaUtil.getDateXDiadelAnio((j + 1) - cantDiasAnioActual, anioActual + 1);
                               else 
                                   date_iniBk = FechaUtil.getDateXDiadelAnio(j + 1, anioActual);
                              date_finBk = date_iniBk;
                            }

                        if(date_iniBk!=null){
                               if(j > cantDiasAnioActual) 
                                   date_finBk = FechaUtil.getDateXDiadelAnio((j + 1) - cantDiasAnioActual, anioActual + 1);
                               else 
                                   date_finBk = FechaUtil.getDateXDiadelAnio(j + 1, anioActual);
                        }
                    }else{
                        sw_date_fin = 1;
                    }

                        if ((date_iniBk!=null && sw_date_fin == 1) || ((j == cantDiasDosanios - 1) && date_iniBk!=null)) {
                            regSolicitud = new Solicitud( equipo[i], FechaUtil.getSqlDate(date_iniBk), FechaUtil.getSqlDate(date_finBk), usuario.getIdPuesto(), FechaUtil.getSqlDate(fechaNow));
                            lstRegistros.add(regSolicitud);
                            date_iniBk = null;
                            date_finBk = null;

                            cont = 0; 
                            sw_date_fin = 0;
                        }
                        k++;
                    }
                }   
            }else{
                k+= cantDiasDosanios;
            }
        }

//       El verdadero Equipo a Grabar
        equipo= new String[lstequipo.size()];
        for (int l = 0; l < equipo.length; l++) {
            equipo[l]= (String)lstequipo.get(l);
            System.out.println("Equipo[" + l + "]: " + equipo[l]);
        }
        if(equipo.length>0){// verifica que vaya a grabar al menos 1 colaborador
            boolean result = false;
            String mensaje = "";
            try {
                result = planificacionManager.insertLstPlanificacion(lstRegistros, equipo, usuario.getIdPuesto(), operacion );
            } catch (Exception e) {
                mensaje = e.getMessage();
            }

            if (result){
                System.out.println("Insertó lstPlanificacion");
                mensaje = "La solicitud ";
                request.setAttribute("EstadoGrabacion", "Se grabó satisfactoriamente");
                 //Enviar correo
                if(operacion==Constantes.ESTADO_JEFE_ENVIAR){
                    List<Usuario> lstUsuario= obtenerCorreosColaboradores(equipo);
                    enviarCorreos(lstUsuario);
                    enviarCorreosAnalista( lstUsuario);
                }
            }else{
                request.setAttribute("EstadoGrabacion", "Hubo un error en la grabación");
            }
        }
        return mapping.findForward("grabar");
    }
    
    public ActionForward grabarMiPlanificacion(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
         Date fechaNow = new Date();
         int anioActual = FechaUtil.getAnioActual();
         Date date_ini = FechaUtil.stringaToDateDDMMYYYY("01-01-" + String.valueOf(anioActual + 0));    
         Date date_fin = FechaUtil.stringaToDateDDMMYYYY("31-12-" + String.valueOf(anioActual + 1)); 
         
        HttpSession session = request.getSession();
        Usuario usuario = (Usuario) session.getAttribute("session_usuario"); 
        
        PlanificacionActionForm resp = (PlanificacionActionForm) form;
        String operacion= resp.getEstado();
        System.out.println("operacion: " + operacion);
        if(operacion.equals("g"))operacion=Constantes.ESTADO_EMPLEADO_GUARDAR;
        if(operacion.equals("e"))operacion=Constantes.ESTADO_EMPLEADO_ENVIAR;
        
        String[] txtDinamicos =  resp.getTextDinamicos();    
        String[] equipo = resp.getEquipo();
        List<Solicitud> lstRegistros = new ArrayList<Solicitud>();
        Solicitud regSolicitud;
        String valor="";
        int cont=0;
        int sw_date_fin=0;
        Date date_iniBk = null;
        Date date_finBk = null;
        int cantDiasAnioActual = FechaUtil.getDiasXAnio(date_ini) ;
        int cantDiasAnioProximo = FechaUtil.getDiasXAnio(date_fin) ;
        int cantDiasDosanios = cantDiasAnioActual + cantDiasAnioProximo;
        System.out.println("Grabar cantDiasDosanios: " + cantDiasDosanios);
        int i; int j=0; int k=0;
        
        for (i = 0; i < equipo.length; i++) {
            for ( j = 0; j < cantDiasDosanios; j++) {
                valor = txtDinamicos[k];
                if (valor.equals(Constantes.SOLICITUD_PLANIFICADA)){
                   sw_date_fin = 0;
                   cont++;
                   if (cont==1){
                       if(j > cantDiasAnioActual) 
                           date_iniBk = FechaUtil.getDateXDiadelAnio((j + 1) - cantDiasAnioActual, anioActual + 1);
                       else 
                           date_iniBk = FechaUtil.getDateXDiadelAnio(j + 1, anioActual);
                      date_finBk = date_iniBk;
                    }
                
                if(date_iniBk!=null){
                       if(j > cantDiasAnioActual) 
                           date_finBk = FechaUtil.getDateXDiadelAnio((j + 1) - cantDiasAnioActual, anioActual + 1);
                       else 
                           date_finBk = FechaUtil.getDateXDiadelAnio(j + 1, anioActual);
                }
            }else{
                sw_date_fin = 1;
                }
                
                
                if ((date_iniBk!=null && sw_date_fin == 1) || ((j == cantDiasDosanios - 1) && date_iniBk!=null)) {
                    regSolicitud = new Solicitud( equipo[i], FechaUtil.getSqlDate(date_iniBk), FechaUtil.getSqlDate(date_finBk), usuario.getIdPuestoJefeInmediato(), FechaUtil.getSqlDate(fechaNow));
                    lstRegistros.add(regSolicitud);
                    date_iniBk = null;
                    date_finBk = null;
                    
                    cont = 0; 
                    sw_date_fin = 0;
                }
                k++;
            }
//            System.out.println("*********** OTRO COLABORADOR *****************");
        }
//        System.out.println("**************************  RANGOS  ****************************************");
//               Iterator it = lstRegistros.iterator();
//               while (it.hasNext()){
//                   regSolicitud = (Solicitud) it.next();
//                        System.out.println("idUsuarioSolicitante: " + regSolicitud.getIdUsuarioSolicitante()  + " Fecha Inicio: " + FechaUtil.formatoYYYYMMDD_DDMMYYYY(regSolicitud.getFechaInicio()) + " - Fecha Fin: " + FechaUtil.formatoYYYYMMDD_DDMMYYYY(regSolicitud.getFechaFin())  + " Jefe: " + regSolicitud.getIdUsuarioAprobador() + " FechaCreacion: " + regSolicitud.getFechaCreacion());
//                }
//       System.out.println("************************** FIN RANGOS  ****************************************");
       
        String estado= planificacionManager.consultarEstado(usuario.getIdUsuario(), anioActual,usuario.getIdPuestoJefeInmediato());
        System.out.println("Estado MiPlanificacion: " + estado);
        if (estado.equals(Constantes.ESTADO_INICIAL) || estado.equals(Constantes.ESTADO_EMPLEADO_GUARDAR)) {

            boolean result = false;
            String mensaje = "";
            try {
                System.out.println("usuario.getIdPuesto(): " + usuario.getIdPuestoJefeInmediato());
                result = planificacionManager.insertLstPlanificacion(lstRegistros, equipo, usuario.getIdPuestoJefeInmediato(), operacion );
            } catch (Exception e) {
                mensaje = e.getMessage();
            }

            if (result){
                System.out.println("Insertó lstPlanificacion");
                mensaje = "La solicitud ";
                request.setAttribute("EstadoGrabacion", "Se grabó satisfactoriamente");
            }else{
                request.setAttribute("EstadoGrabacion", "Hubo un error en la grabación");
            }
        }
        return mapping.findForward("grabarMiPlanificacion");
    }
 
     
     public ActionForward cargarVistaAnual(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
                System.out.println("cargarVistaAnual");
         int anio = Integer.parseInt(request.getParameter("anio"));
         String idUsuario = request.getParameter("idUsuario");
         String idUsuarioAprobador = request.getParameter("idUsuarioAprobador");
         String cargar = listarFechasVistaAnualSql(idUsuario,idUsuarioAprobador, anio);
         String[] arrayFechas = cargar.split(",");
                System.out.println("anio: " + anio + " idUsuario: " + idUsuario + " idPuesto: " + idUsuarioAprobador  + " arrayFechas.length: " + arrayFechas.length);
         int anioFechas=0;
         StringBuilder lstFechas = new StringBuilder();
         String fecha=""; 
         int cont=0;
         for (int i = 0; i < arrayFechas.length; i++) {
             if (!arrayFechas[i].equals("")) {
                    System.out.println("arrayFechas["+ i + "]: " + arrayFechas[i]);
                 anioFechas = Integer.parseInt(arrayFechas[i].substring(0, 4));
                    System.out.println("anioFechas: " + anioFechas);
                     if (anio == anioFechas) {
                         if(cont>0)lstFechas.append(",");
                         fecha = FechaUtil.formatoYYYYMMDD_DDMMYYYY(arrayFechas[i]);
                         lstFechas.append(fecha.replaceAll("-", "/"));
                         cont++;
                     }
             }                  
         }
         System.out.println("cargar: " + lstFechas.toString());
         request.setAttribute("anioActual", FechaUtil.getAnioActual());
         request.setAttribute("fechasVistaAnual", lstFechas.toString());
         
         return mapping.findForward("cargarVistaAnual");
     }
     
     public ActionForward cargarSolicitud(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
         System.out.println("cargarSolicitud");
            Document document = new Document(PageSize.A4);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter.getInstance(document, baos);
            
             String fs = File.separator;
             String ruta = request.getRealPath(fs);
                System.out.println("ruta: " + ruta);
            
            document= new SolicitudVacacion().Solicitud(ruta, document);
            response.setHeader("Content-Disposition"," attachment; filename=\"SistemaGestióndeVacaciones.pdf\"");
            ServletOutputStream out = response.getOutputStream();
            baos.writeTo(out);
            out.flush();
            out.close();
         return null;
     }
     
      private String listarFechasVistaAnualSql( String idUsuario, String idPuesto, int anioActual){
          String lstFechas = "";
          lstFechas = planificacionManager.consultarFechasVistaAnual(idUsuario, idPuesto, anioActual);
        return lstFechas;
     }
      
public ActionForward ajaxProceso(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
          System.out.println("ajaxProceso: " + "ajaxProceso");
          response.getWriter().println("ok");
          return null;
      }
      
 private List<Usuario> obtenerCorreosColaboradores(String[] equipo){
        List<Usuario> lstUsuario= new ArrayList<Usuario>();
        Usuario usuario= new Usuario();
        ResultSet rst = null;
        for (int kk = 0; kk < equipo.length; kk++) {
            System.out.println("equipo["+kk+"]: " + equipo[kk] ); 
            rst = new ConexionBDSeg().ExecuteSelect(consultarCorreo(equipo[kk]), "PlanificacionAction");  

                try {
                    usuario= new Usuario();
                    while (rst.next()) {
                        usuario.setNombreUsuario(rst.getString("nombreUsuario"));
                        usuario.setApellidoUsuario(rst.getString("apellidoUsuario"));
                        usuario.setCorreoUsuario(rst.getString("correoUsuario"));
                        usuario.setDivisionUsuario(rst.getString("divisionUsuario"));
                        System.out.println("nombreUsuario: " + usuario.getNombreUsuario());
                        if (!usuario.getNombreUsuario().equals("") && !usuario.getCorreoUsuario().equals("")) {
                            lstUsuario.add(usuario);
                            System.out.println("Adjunta equipo["+kk+"]: " + equipo[kk] ); 
                        }
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(PlanificacionAction.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
    return lstUsuario; 
   }

 private String consultarCorreo(String idUsuario){
    StringBuilder sql = new StringBuilder();
            
            sql.append("select ");
            sql.append("[nombreUsuario],");
            sql.append("[apellidoUsuario],");
            sql.append("[correoUsuario],");
            sql.append("[divisionUsuario]");
            sql.append(" from [PuestoPorUsuario]  where [idUsuario]='");
            sql.append(idUsuario) ;
            sql.append("'");
            
    
            return sql.toString();
    }

 private String obtenerConfiguracionCorreo(String abreviatura) throws SQLException{
        ResultSet rst = null;
        StringBuilder sql = new StringBuilder();
        String result="";
        sql.append("Select  descripcion from CatalogoDetalle WHERE abreviatura ='");
        sql.append(abreviatura);
        sql.append("'");
        rst = new ConexionBD().ExecuteSelect(sql.toString(), "Demonio");
        if (rst.next()) {
                result = rst.getString(1);
            }
        System.out.println("Result: " + result);
        return result;
    }
 
 private void enviarCorreos(List<Usuario> lstUsuario) throws Exception{
        EnviarCorreo enviaCorreo = new EnviarCorreo(obtenerConfiguracionCorreo( Constantes.SERVIDOR_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_RRHH));
        Usuario usuario;
        Iterator i =lstUsuario.iterator();
        String mensajeCorreo = "", mensaje = "";
        String fechaIni ="";
        String FechaFin = "";
        String nombreCompletoUsuario="";
        
                while (i.hasNext()) {
                    usuario =(Usuario) i.next();
                    nombreCompletoUsuario= usuario.getNombreUsuario() + " " + usuario.getApellidoUsuario();
                    mensajeCorreo = enviaCorreo.avisarColaboradorJefe(nombreCompletoUsuario, usuario.getCorreoUsuario());
//                    mensajeCorreo = enviaCorreo.avisarJefeVacacionesPlanificadas(fechaIni, FechaFin, correo.getCorreoJefe(), correo.getNombreColaborador().trim(), correo.getApellidoColaborador().trim(), correo.getSubdivision());
//                    
//                    mensajeCorreo = enviarCorreosAnalista(enviaCorreo, correo.getDivision(), fechaIni, FechaFin, correo.getNombreColaborador().trim(), correo.getApellidoColaborador().trim(), correo.getSubdivision());
                    if (mensajeCorreo.equals("1")) {
                        mensaje += "se realizó con éxito ";
                    } else {
                        mensaje += "no se realizó con éxito por el siguiente error \n";
                        mensaje += mensajeCorreo;
                    }
                    System.out.println("mensaje: " + mensaje);
                }        
    }
 
  private String enviarCorreosAnalista(List<Usuario> lstUsuario) throws Exception{
        EnviarCorreo enviaCorreo = new EnviarCorreo(obtenerConfiguracionCorreo( Constantes.SERVIDOR_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_RRHH));
        String mensajeCorreo ="";
        Iterator it =lstUsuario.iterator();
        SimpleEquipoManager equipo = new SimpleEquipoManager();
        String[] correoAnalistas = null;
        Usuario usuario;
        while (it.hasNext()) {
            usuario =(Usuario) it.next();
            System.out.println("usuario.getDivisionUsuario(): " + usuario.getDivisionUsuario());
            correoAnalistas= equipo.listarAnalistas(usuario.getDivisionUsuario());
            System.out.println("correoAnalistas.length: " + correoAnalistas.length);
            for (int i = 0; i < correoAnalistas.length; i++) {
                System.out.println("correoAnalistas[i]: " + correoAnalistas[i]);
            mensajeCorreo = enviaCorreo.avisarAnalistaJefe( correoAnalistas[i], usuario.getNombreUsuario(), usuario.getApellidoUsuario());
            }
        }
        
        return mensajeCorreo;
    }
  
  public ActionForward imprimirSolicitud(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
        HttpSession session = request.getSession();
        Usuario usuario = (Usuario) session.getAttribute("session_usuario"); 
        Usuario usuarioSAP = new Usuario();
        usuarioSAP.setIdUsuario(usuario.getIdUsuario());
        usuarioSAP.setIdPersonal(usuario.getIdPersonal());
        
        usuarioSAP = planificacionManager.obtenerDataParaSolicitudVacaciones(usuarioSAP);
        request.setAttribute("usuarioSAP", usuarioSAP);
        return mapping.findForward("imprimirSolicitud");
    }
}
